# importing our data
data = data.import()
Read 5 items
Read 3 items
Read 3 items
Read 5 items
Read 3 items
Read 3 items
Read 4 items
Read 4 items
Read 18 items
Read 6 items
Read 8 items
Read 6 items
Read 18 items
Read 6 items
Read 8 items
Read 6 items
Read 18 items
Read 6 items
Read 8 items
Read 6 items
Read 9 items
Read 3 items
Read 2 items
Read 6 items
Read 13 items
Read 4 items
Read 7 items
Read 4 items
Read 3 items
Read 2 items
Read 2 items
the condition has length > 1 and only the first element will be used
head(data)
Overview
summary(data)
dtPosix dt dt_iso city_id temp temp_min temp_max
Min. :2017-01-01 00:00:00 Min. :1.483e+09 2017-03-18 06:00:00 +0000 UTC: 3 Min. :2950159 Min. :263.1 Min. :261.1 Min. :263.7
1st Qu.:2017-04-01 10:45:00 1st Qu.:1.491e+09 2017-03-30 01:00:00 +0000 UTC: 3 1st Qu.:2950159 1st Qu.:277.1 1st Qu.:277.1 1st Qu.:277.4
Median :2017-07-03 15:30:00 Median :1.499e+09 2017-03-30 02:00:00 +0000 UTC: 3 Median :2950159 Median :283.1 Median :283.1 Median :283.1
Mean :2017-07-03 03:05:03 Mean :1.499e+09 2017-03-30 03:00:00 +0000 UTC: 3 Mean :2950159 Mean :283.4 Mean :283.0 Mean :283.7
3rd Qu.:2017-10-04 02:15:00 3rd Qu.:1.507e+09 2017-03-30 04:00:00 +0000 UTC: 3 3rd Qu.:2950159 3rd Qu.:289.1 3rd Qu.:289.1 3rd Qu.:289.1
Max. :2017-12-31 23:00:00 Max. :1.515e+09 (Other) :9104 Max. :2950159 Max. :305.1 Max. :305.1 Max. :305.1
NA's :37 NA's : 37 NA's :37 NA's :37 NA's :37 NA's :37
pressure humidity wind_speed wind_deg rain_3h clouds_all weather_id weather_main weather_description
Min. : 980 Min. : 14.00 Min. : 0.00 Min. : 0.0 Min. :0.118 Min. : 0.00 Min. :200.0 Clouds :3434 Sky is Clear :2972
1st Qu.:1010 1st Qu.: 67.00 1st Qu.: 2.00 1st Qu.:120.0 1st Qu.:0.150 1st Qu.: 0.00 1st Qu.:701.0 Clear :2973 broken clouds :2380
Median :1016 Median : 81.00 Median : 3.00 Median :230.0 Median :0.380 Median : 75.00 Median :800.0 Rain :1195 light rain : 803
Mean :1015 Mean : 77.17 Mean : 3.43 Mean :197.5 Mean :0.672 Mean : 45.13 Mean :728.3 Mist : 598 mist : 598
3rd Qu.:1021 3rd Qu.: 93.00 3rd Qu.: 5.00 3rd Qu.:270.0 3rd Qu.:0.889 3rd Qu.: 75.00 3rd Qu.:803.0 Fog : 383 scattered clouds: 536
Max. :1043 Max. :100.00 Max. :14.00 Max. :360.0 Max. :9.865 Max. :100.00 Max. :804.0 (Other): 536 (Other) :1830
NA's :37 NA's :37 NA's :37 NA's :37 NA's :9066 NA's :37 NA's :37 NA's : 37 NA's : 37
weather_icon temp.c temp.c.group weekday hours chb.all chb.background chb.traffic cht.all
01n :1593 Min. :-10.02 Min. :-10.00 sun :1331 4 : 392 Min. :0.2000 Min. :0.1000 Min. :0.200 Min. : 0.000
04d :1390 1st Qu.: 4.00 1st Qu.: 5.00 wed :1316 6 : 392 1st Qu.:0.6667 1st Qu.:0.5000 1st Qu.:0.750 1st Qu.: 1.333
01d :1379 Median : 10.00 Median : 11.00 fri :1314 1 : 391 Median :0.9333 Median :0.7000 Median :1.050 Median : 2.000
04n :1171 Mean : 10.21 Mean : 10.24 thu :1303 3 : 390 Mean :1.1730 Mean :0.9167 Mean :1.303 Mean : 2.483
50n : 673 3rd Qu.: 16.00 3rd Qu.: 17.00 tue :1290 2 : 389 3rd Qu.:1.3667 3rd Qu.:1.1000 3rd Qu.:1.550 3rd Qu.: 3.000
(Other):2913 Max. : 32.00 Max. : 32.00 (Other):2565 (Other):7165 Max. :8.9000 Max. :9.8000 Max. :9.400 Max. :19.667
NA's : 37 NA's :37 NA's :1647 NA's : 37 NA's : 37 NA's :1 NA's :162 NA's :9 NA's :1
cht.background cht.traffic co.all co.traffic no2.all no2.background no2.traffic no2.suburb no.all
Min. : 0.00 Min. : 0.000 Min. :0.1000 Min. :0.1000 Min. : 3.929 Min. : 4.00 Min. : 4.00 Min. : 1.20 Min. : 0.4375
1st Qu.: 1.00 1st Qu.: 1.500 1st Qu.:0.2667 1st Qu.:0.2667 1st Qu.: 19.750 1st Qu.: 15.40 1st Qu.: 31.00 1st Qu.: 6.60 1st Qu.: 6.4375
Median : 1.00 Median : 2.500 Median :0.3500 Median :0.3500 Median : 27.625 Median : 22.40 Median : 44.83 Median :10.80 Median : 13.0000
Mean : 1.81 Mean : 2.819 Mean :0.3867 Mean :0.3867 Mean : 29.279 Mean : 25.35 Mean : 45.88 Mean :12.94 Mean : 17.8855
3rd Qu.: 2.00 3rd Qu.: 3.500 3rd Qu.:0.4500 3rd Qu.:0.4500 3rd Qu.: 36.806 3rd Qu.: 32.60 3rd Qu.: 58.33 3rd Qu.:17.00 3rd Qu.: 23.0000
Max. :24.00 Max. :18.500 Max. :2.2500 Max. :2.2500 Max. :144.062 Max. :171.40 Max. :187.67 Max. :66.40 Max. :273.3125
NA's :161 NA's :4 NA's :1 NA's :1 NA's :1 NA's :1 NA's :1 NA's :1 NA's :1
no.background no.traffic no.suburb nox.all nox.background nox.traffic nox.suburb o3.all
Min. : 0.000 Min. : 1.167 Min. : 0.000 Min. : 6.00 Min. : 5.20 Min. : 7.833 Min. : 1.60 Min. : 0.50
1st Qu.: 1.250 1st Qu.: 15.333 1st Qu.: 0.200 1st Qu.: 30.69 1st Qu.: 18.20 1st Qu.: 55.333 1st Qu.: 7.00 1st Qu.: 24.17
Median : 2.800 Median : 31.143 Median : 0.400 Median : 48.27 Median : 27.00 Median : 94.000 Median : 11.60 Median : 42.50
Mean : 6.473 Mean : 40.297 Mean : 1.783 Mean : 56.59 Mean : 35.22 Mean :107.422 Mean : 15.66 Mean : 44.07
3rd Qu.: 6.000 3rd Qu.: 53.500 3rd Qu.: 1.200 3rd Qu.: 71.00 3rd Qu.: 41.60 3rd Qu.:140.333 3rd Qu.: 19.25 3rd Qu.: 60.67
Max. :361.800 Max. :419.667 Max. :90.000 Max. :561.44 Max. :723.80 Max. :828.500 Max. :189.20 Max. :142.67
NA's :1 NA's :1 NA's :1 NA's :1 NA's :1 NA's :1 NA's :1 NA's :1
o3.background o3.traffic o3.suburb pm10.all pm10.background pm10.traffic pm10.suburb so2.all so2.background
Min. : 0.00 Min. : 1.0 Min. : 0.25 Min. : 4.00 Min. : 3.333 Min. : 5.00 Min. : 3.00 Min. : 0.000 Min. : 0.000
1st Qu.: 20.00 1st Qu.:11.0 1st Qu.: 25.62 1st Qu.: 13.91 1st Qu.: 12.667 1st Qu.: 16.80 1st Qu.: 10.00 1st Qu.: 0.500 1st Qu.: 0.000
Median : 38.50 Median :25.0 Median : 45.00 Median : 18.82 Median : 17.667 Median : 22.40 Median : 14.00 Median : 1.000 Median : 1.000
Mean : 40.46 Mean :24.3 Mean : 45.94 Mean : 22.70 Mean : 21.351 Mean : 26.68 Mean : 17.29 Mean : 1.522 Mean : 1.198
3rd Qu.: 57.50 3rd Qu.:35.0 3rd Qu.: 63.00 3rd Qu.: 27.70 3rd Qu.: 26.333 3rd Qu.: 32.20 3rd Qu.: 21.33 3rd Qu.: 1.500 3rd Qu.: 1.000
Max. :138.00 Max. :72.0 Max. :145.00 Max. :283.73 Max. :211.667 Max. :465.40 Max. :106.33 Max. :356.000 Max. :27.000
NA's :2 NA's :8469 NA's :1 NA's :1 NA's :1 NA's :1 NA's :1 NA's :4 NA's :27
so2.traffic wind.deg.name
Min. : 0.000 Length:9156
1st Qu.: 1.000 Class :character
Median : 1.000 Mode :character
Mean : 1.844
3rd Qu.: 2.000
Max. :699.000
NA's :54
pm10 over the year
pollutant = c("pm10.background", "pm10.traffic", "pm10.suburb")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak")

plot.pollutant(data, pollutant, month = "01", yMax = 150)

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

chb over the year
pollutant = c("chb.background", "chb.traffic")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak")

plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

CHT over the year
pollutant = c("cht.background", "cht.traffic")
plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

CO over the year
# there are only traffic sensors for co
pollutant = c("co.traffic")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak")

plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

5. no2 over the year
pollutant = c("no2.background", "no2.traffic")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak")

plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

6. O3 over the year
pollutant = c("o3.background", "o3.traffic", "o3.suburb")
plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

so2 over the year
pollutant = c("so2.background", "so2.traffic")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak", yMax = 15)

plot.pollutant(data, pollutant, month = "01", yMax = 15)

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

wind correlation
ggplot(data, aes(wind.deg.name,wind_speed, group = wind.deg.name)) + geom_boxplot() + ylim(0, 15) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,pm10.all, group = wind_speed)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,co.traffic, group = wind_speed)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,no2.all, group = wind_speed)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,so2.all, group = wind_speed)) + geom_boxplot() + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,o3.all, group = wind_speed)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,chb.all, group = wind_speed)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,cht.all, group = wind_speed)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,pm10.all, group = wind.deg.name)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,co.traffic, group = wind.deg.name)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,no2.all, group = wind.deg.name)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,so2.all, group = wind.deg.name)) + geom_boxplot() + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,o3.all, group = wind.deg.name)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,chb.all, group = wind.deg.name)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,cht.all, group = wind.deg.name)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

temp correlation
ggplot(data, aes(temp.c.group, pm10.all, group = temp.c.group)) + geom_boxplot() + ylim(0, 15) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, co.traffic, group = temp.c.group)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, no2.all, group = temp.c.group)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, so2.all, group = temp.c.group)) + geom_boxplot() + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, o3.all, group = temp.c.group)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, chb.all, group = temp.c.group)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, cht.all, group = temp.c.group)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

weather main correlation
ggplot(data, aes(weather_main, pm10.all, group = weather_main)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, co.traffic, group = weather_main)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, no2.all, group = weather_main)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, so2.all, group = weather_main)) + geom_boxplot() + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, o3.all, group = weather_main)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, chb.all, group = weather_main)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, cht.all, group = weather_main)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

pressure correlation
ggplot(data, aes(pressure, pm10.all, group = pressure)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, co.traffic, group = pressure)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, no2.all, group = pressure)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, so2.all, group = pressure)) + geom_boxplot() + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, o3.all, group = pressure)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, chb.all, group = pressure)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, cht.all, group = pressure)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

humidity correlation
ggplot(data, aes(humidity, pm10.all, group = humidity)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, co.traffic, group = humidity)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, no2.all, group = humidity)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, so2.all, group = humidity)) + geom_boxplot() + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, o3.all, group = humidity)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, chb.all, group = humidity)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, cht.all, group = humidity)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

clouds correlation
ggplot(data, aes(clouds_all, pm10.all, group = clouds_all)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, co.traffic, group = clouds_all)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, no2.all, group = clouds_all)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, so2.all, group = clouds_all)) + geom_boxplot() + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, o3.all, group = clouds_all)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, chb.all, group = clouds_all)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, cht.all, group = clouds_all)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

pollutant to pollutant correlations

LS0tCnRpdGxlOiAiRGF0YSBFeHBsb3JhdGlvbiBvZiBwb2xsdXRhbnRzIHBsdXMgd2VhdGhlciBpbiBCZXJsaW4iCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCmBgYHtyIHNldHVwLCBlY2hvPUZBTFNFfQpzb3VyY2UoIi4vZGF0YUltcG9ydC5SIikKbGlicmFyeShsYXR0aWNlKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUocmVzaGFwZTIpCnJlcXVpcmUocGx5cikKCnBsb3QucG9sbHV0YW50ID0gZnVuY3Rpb24oZGF0YSwgcG9sbHV0YW50cywgbW9udGg9IjAwIiwgZGF5PSIwMCIsIHRpdGxlPSIiLCB5TWF4PTApIHsKICBkZiA9IGRhdGFbYygiZHRQb3NpeCIsIHBvbGx1dGFudHMpXQogIGRmID0gbWVsdChkZiwgaWQudmFycyA9ICdkdFBvc2l4JywgdmFyaWFibGUubmFtZSA9ICJwb2xsdXRhbnQiLCB2YWx1ZS5uYW1lID0gInZhbHVlIikKICAKICBpZiAoZGF5ID09ICIwMCIgJiBtb250aCAhPSAiMDAiKQogICAgZGYgPSBzdWJzZXQoZGYsIGZvcm1hdC5EYXRlKGR0UG9zaXgsICIlbSIpPT1tb250aCkKICBlbHNlIGlmIChkYXkgIT0gIjAwIiAmIG1vbnRoICE9ICIwMCIpCiAgICBkZiA9IHN1YnNldChkZiwgZm9ybWF0LkRhdGUoZHRQb3NpeCwgIiVtIik9PW1vbnRoICYgZm9ybWF0LkRhdGUoZHRQb3NpeCwgIiVkIik9PWRheSkKICAKICBwbG90IDwtIGdncGxvdChkZiwgYWVzKGR0UG9zaXgsdmFsdWUpKSArIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IHBvbGx1dGFudCkpCgogIGlmICh5TWF4ICE9IDApIHsKICAgIHBsb3QgPC0gcGxvdCArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCB5TWF4KSkgCiAgfQogIAogICAgcGxvdCArIGdndGl0bGUodGl0bGUpCn0gIApgYGAKCgpgYGB7cn0KIyBpbXBvcnRpbmcgb3VyIGRhdGEKZGF0YSA9IGRhdGEuaW1wb3J0KCkKCmhlYWQoZGF0YSkKYGBgCgoKIyMgT3ZlcnZpZXcKYGBge3J9CnN1bW1hcnkoZGF0YSkKYGBgCgojIyBwbTEwIG92ZXIgdGhlIHllYXIKCmBgYHtyfQpwb2xsdXRhbnQgPSBjKCJwbTEwLmJhY2tncm91bmQiLCAicG0xMC50cmFmZmljIiwgInBtMTAuc3VidXJiIikKCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiLCBkYXkgPSAiMDEiLCB0aXRsZSA9ICIxLiBKYW51YXJ5IHdpdGggc2lsdmVzdGVyIGZpcmV3b3JrIHBlYWsiKQogIApwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAxIiwgeU1heCA9IDE1MCkKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMiIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDMiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA0IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDYiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA3IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwOCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDkiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjEwIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTIiKQpgYGAKCgojIyBjaGIgb3ZlciB0aGUgeWVhcgpgYGB7cn0KcG9sbHV0YW50ID0gYygiY2hiLmJhY2tncm91bmQiLCAiY2hiLnRyYWZmaWMiKQoKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMSIsIGRheSA9ICIwMSIsIHRpdGxlID0gIjEuIEphbnVhcnkgd2l0aCBzaWx2ZXN0ZXIgZmlyZXdvcmsgcGVhayIpCiAgCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAyIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDQiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA1IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNiIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDciKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA4IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwOSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTAiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjExIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMiIpCmBgYAoKIyMgQ0hUIG92ZXIgdGhlIHllYXIKYGBge3J9CnBvbGx1dGFudCA9IGMoImNodC5iYWNrZ3JvdW5kIiwgImNodC50cmFmZmljIikKICAKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDIiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAzIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDUiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA2IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDgiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA5IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjEyIikKYGBgCgojIyBDTyBvdmVyIHRoZSB5ZWFyCmBgYHtyfQojIHRoZXJlIGFyZSBvbmx5IHRyYWZmaWMgc2Vuc29ycyBmb3IgY28KcG9sbHV0YW50ID0gYygiY28udHJhZmZpYyIpCgpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAxIiwgZGF5ID0gIjAxIiwgdGl0bGUgPSAiMS4gSmFudWFyeSB3aXRoIHNpbHZlc3RlciBmaXJld29yayBwZWFrIikKICAKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDIiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAzIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDUiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA2IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDgiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA5IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjEyIikKYGBgCgojIyA1LiBubzIgb3ZlciB0aGUgeWVhcgpgYGB7cn0KcG9sbHV0YW50ID0gYygibm8yLmJhY2tncm91bmQiLCAibm8yLnRyYWZmaWMiKQoKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMSIsIGRheSA9ICIwMSIsIHRpdGxlID0gIjEuIEphbnVhcnkgd2l0aCBzaWx2ZXN0ZXIgZmlyZXdvcmsgcGVhayIpCiAgCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAyIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDQiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA1IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNiIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDciKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA4IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwOSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTAiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjExIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMiIpCmBgYAoKIyMgNi4gTzMgb3ZlciB0aGUgeWVhcgpgYGB7cn0KcG9sbHV0YW50ID0gYygibzMuYmFja2dyb3VuZCIsICJvMy50cmFmZmljIiwgIm8zLnN1YnVyYiIpCiAgCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAyIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDQiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA1IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNiIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDciKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA4IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwOSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTAiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjExIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMiIpCmBgYAoKIyMgc28yIG92ZXIgdGhlIHllYXIKYGBge3J9CnBvbGx1dGFudCA9IGMoInNvMi5iYWNrZ3JvdW5kIiwgInNvMi50cmFmZmljIikKCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiLCBkYXkgPSAiMDEiLCB0aXRsZSA9ICIxLiBKYW51YXJ5IHdpdGggc2lsdmVzdGVyIGZpcmV3b3JrIHBlYWsiLCB5TWF4ID0gMTUpCiAgCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiLCB5TWF4ID0gMTUpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDIiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAzIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDUiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA2IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDgiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA5IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjEyIikKYGBgCgojIyB3aW5kIGNvcnJlbGF0aW9uCmBgYHtyfQoKZ2dwbG90KGRhdGEsIGFlcyh3aW5kLmRlZy5uYW1lLHdpbmRfc3BlZWQsIGdyb3VwID0gd2luZC5kZWcubmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDE1KSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCgpnZ3Bsb3QoZGF0YSwgYWVzKHdpbmRfc3BlZWQscG0xMC5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDcwKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2luZF9zcGVlZCxjby50cmFmZmljLCBncm91cCA9IHdpbmRfc3BlZWQpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kX3NwZWVkLG5vMi5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kX3NwZWVkLHNvMi5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgICsgeWxpbSgwLCA1KSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHdpbmRfc3BlZWQsbzMuYWxsLCBncm91cCA9IHdpbmRfc3BlZWQpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kX3NwZWVkLGNoYi5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kX3NwZWVkLGNodC5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKCmdncGxvdChkYXRhLCBhZXMod2luZC5kZWcubmFtZSxwbTEwLmFsbCwgZ3JvdXAgPSB3aW5kLmRlZy5uYW1lKSkgKyBnZW9tX2JveHBsb3QoKSArIHlsaW0oMCwgNzApICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kLmRlZy5uYW1lLGNvLnRyYWZmaWMsIGdyb3VwID0gd2luZC5kZWcubmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kLmRlZy5uYW1lLG5vMi5hbGwsIGdyb3VwID0gd2luZC5kZWcubmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHdpbmQuZGVnLm5hbWUsc28yLmFsbCwgZ3JvdXAgPSB3aW5kLmRlZy5uYW1lKSkgKyBnZW9tX2JveHBsb3QoKSAgKyB5bGltKDAsIDUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kLmRlZy5uYW1lLG8zLmFsbCwgZ3JvdXAgPSB3aW5kLmRlZy5uYW1lKSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2luZC5kZWcubmFtZSxjaGIuYWxsLCBncm91cCA9IHdpbmQuZGVnLm5hbWUpKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2luZC5kZWcubmFtZSxjaHQuYWxsLCBncm91cCA9IHdpbmQuZGVnLm5hbWUpKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCgoKCgpgYGAKCgojIyB0ZW1wIGNvcnJlbGF0aW9uCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKHRlbXAuYy5ncm91cCwgcG0xMC5hbGwsIGdyb3VwID0gdGVtcC5jLmdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKSArIHlsaW0oMCwgMTUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh0ZW1wLmMuZ3JvdXAsIGNvLnRyYWZmaWMsIGdyb3VwID0gdGVtcC5jLmdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXModGVtcC5jLmdyb3VwLCBubzIuYWxsLCBncm91cCA9IHRlbXAuYy5ncm91cCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHRlbXAuYy5ncm91cCwgc28yLmFsbCwgZ3JvdXAgPSB0ZW1wLmMuZ3JvdXApKSArIGdlb21fYm94cGxvdCgpICArIHlsaW0oMCwgNSkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHRlbXAuYy5ncm91cCwgbzMuYWxsLCBncm91cCA9IHRlbXAuYy5ncm91cCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh0ZW1wLmMuZ3JvdXAsIGNoYi5hbGwsIGdyb3VwID0gdGVtcC5jLmdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHRlbXAuYy5ncm91cCwgY2h0LmFsbCwgZ3JvdXAgPSB0ZW1wLmMuZ3JvdXApKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmBgYAoKCiMjIHdlYXRoZXIgbWFpbiBjb3JyZWxhdGlvbgpgYGB7cn0KZ2dwbG90KGRhdGEsIGFlcyh3ZWF0aGVyX21haW4sIHBtMTAuYWxsLCBncm91cCA9IHdlYXRoZXJfbWFpbikpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDcwKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2VhdGhlcl9tYWluLCBjby50cmFmZmljLCBncm91cCA9IHdlYXRoZXJfbWFpbikpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHdlYXRoZXJfbWFpbiwgbm8yLmFsbCwgZ3JvdXAgPSB3ZWF0aGVyX21haW4pKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3ZWF0aGVyX21haW4sIHNvMi5hbGwsIGdyb3VwID0gd2VhdGhlcl9tYWluKSkgKyBnZW9tX2JveHBsb3QoKSAgKyB5bGltKDAsIDUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3ZWF0aGVyX21haW4sIG8zLmFsbCwgZ3JvdXAgPSB3ZWF0aGVyX21haW4pKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2VhdGhlcl9tYWluLCBjaGIuYWxsLCBncm91cCA9IHdlYXRoZXJfbWFpbikpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3ZWF0aGVyX21haW4sIGNodC5hbGwsIGdyb3VwID0gd2VhdGhlcl9tYWluKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpgYGAKCiMjIHByZXNzdXJlIGNvcnJlbGF0aW9uCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKHByZXNzdXJlLCBwbTEwLmFsbCwgZ3JvdXAgPSBwcmVzc3VyZSkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDcwKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMocHJlc3N1cmUsIGNvLnRyYWZmaWMsIGdyb3VwID0gcHJlc3N1cmUpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhwcmVzc3VyZSwgbm8yLmFsbCwgZ3JvdXAgPSBwcmVzc3VyZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHByZXNzdXJlLCBzbzIuYWxsLCBncm91cCA9IHByZXNzdXJlKSkgKyBnZW9tX2JveHBsb3QoKSAgKyB5bGltKDAsIDUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhwcmVzc3VyZSwgbzMuYWxsLCBncm91cCA9IHByZXNzdXJlKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHByZXNzdXJlLCBjaGIuYWxsLCBncm91cCA9IHByZXNzdXJlKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHByZXNzdXJlLCBjaHQuYWxsLCBncm91cCA9IHByZXNzdXJlKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpgYGAKCiMjIGh1bWlkaXR5IGNvcnJlbGF0aW9uCgpgYGB7cn0KZ2dwbG90KGRhdGEsIGFlcyhodW1pZGl0eSwgcG0xMC5hbGwsIGdyb3VwID0gaHVtaWRpdHkpKSArIGdlb21fYm94cGxvdCgpICsgeWxpbSgwLCA3MCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGh1bWlkaXR5LCBjby50cmFmZmljLCBncm91cCA9IGh1bWlkaXR5KSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMoaHVtaWRpdHksIG5vMi5hbGwsIGdyb3VwID0gaHVtaWRpdHkpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhodW1pZGl0eSwgc28yLmFsbCwgZ3JvdXAgPSBodW1pZGl0eSkpICsgZ2VvbV9ib3hwbG90KCkgICsgeWxpbSgwLCA1KSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMoaHVtaWRpdHksIG8zLmFsbCwgZ3JvdXAgPSBodW1pZGl0eSkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhodW1pZGl0eSwgY2hiLmFsbCwgZ3JvdXAgPSBodW1pZGl0eSkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhodW1pZGl0eSwgY2h0LmFsbCwgZ3JvdXAgPSBodW1pZGl0eSkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKYGBgCgojIyBjbG91ZHMgY29ycmVsYXRpb24KCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIHBtMTAuYWxsLCBncm91cCA9IGNsb3Vkc19hbGwpKSArIGdlb21fYm94cGxvdCgpICsgeWxpbSgwLCA3MCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIGNvLnRyYWZmaWMsIGdyb3VwID0gY2xvdWRzX2FsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIG5vMi5hbGwsIGdyb3VwID0gY2xvdWRzX2FsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIHNvMi5hbGwsIGdyb3VwID0gY2xvdWRzX2FsbCkpICsgZ2VvbV9ib3hwbG90KCkgICsgeWxpbSgwLCA1KSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMoY2xvdWRzX2FsbCwgbzMuYWxsLCBncm91cCA9IGNsb3Vkc19hbGwpKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMoY2xvdWRzX2FsbCwgY2hiLmFsbCwgZ3JvdXAgPSBjbG91ZHNfYWxsKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIGNodC5hbGwsIGdyb3VwID0gY2xvdWRzX2FsbCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKYGBgCgojIyBwb2xsdXRhbnQgdG8gcG9sbHV0YW50IGNvcnJlbGF0aW9ucwoKYGBge3J9CmdncGxvdChkYXRhLCBhZXMoY28udHJhZmZpYywgcG0xMC5hbGwsIGdyb3VwID0gY28udHJhZmZpYykpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDEwMCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKG5vMi5hbGwsIHBtMTAuYWxsLCBncm91cCA9IG5vMi5hbGwpKSArIGdlb21fYm94cGxvdCgpICsgeWxpbSgwLCAxMDApICsgeGxpbSgwLCAxMDApICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhzbzIuYWxsLCBwbTEwLmFsbCwgZ3JvdXAgPSBzbzIuYWxsKSkgKyBnZW9tX2JveHBsb3QoKSArIHlsaW0oMCwgMTAwKSArIHhsaW0oMCwgMTUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhvMy5hbGwsIHBtMTAuYWxsLCBncm91cCA9IG8zLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDEwMCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKCgpnZ3Bsb3QoZGF0YSwgYWVzKG5vMi5hbGwsIGNvLnRyYWZmaWMsIGdyb3VwID0gbm8yLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB4bGltKDAsIDEwMCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHNvMi5hbGwsIGNvLnRyYWZmaWMsIGdyb3VwID0gc28yLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB4bGltKDAsIDE1KSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMobzMuYWxsLCBjby50cmFmZmljLCBncm91cCA9IG8zLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDEuNSkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKCmdncGxvdChkYXRhLCBhZXMoc28yLmFsbCwgbm8yLmFsbCwgZ3JvdXAgPSBzbzIuYWxsKSkgKyBnZW9tX2JveHBsb3QoKSArIHhsaW0oMCwgMzApICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhvMy5hbGwsIG5vMi5hbGwsIGdyb3VwID0gbzMuYWxsKSkgKyBnZW9tX2JveHBsb3QoKSAgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKCmdncGxvdChkYXRhLCBhZXMobzMuYWxsLCBzbzIuYWxsLCBncm91cCA9IG8zLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDIwKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpgYGAKCg==